package com.artazapedidos.view;

import com.artazapedidos.persistence.Producto;
import com.artazapedidos.persistence.Usuario;
import com.google.appengine.api.datastore.Key;
import com.artazapedidos.service.ProductoService;
import com.artazapedidos.service.UsuarioService;
import com.artazapedidos.view.utils.MessageProvider;
import com.google.appengine.api.taskqueue.TaskQueuePb.TaskQueueAddRequest.RequestMethod;
import java.util.*;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.binding.message.MessageBuilder;
import org.springframework.context.annotation.Scope;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.webflow.execution.RequestContext;

@Controller("usuarioController")
@Scope("request")
public class UsuarioController {

    UsuarioService usuarioService;

    Usuario miusuario;
    private Collection<Usuario> usuarios;
    private AuthenticationManager authenticationManager;

    @Autowired
    @Required
    public void setAuthenticationManager(AuthenticationManager authenticationManager) {
        this.authenticationManager = authenticationManager;
    }

    @Autowired
    @Required
    public void setUsuarioService(UsuarioService usuarioService) {
        this.usuarioService = usuarioService;
    }

    @PostConstruct
    private void iniciar() {
        miusuario = new Usuario();
    }

    public Usuario getMiusuario() {
        return miusuario;
    }

    public void setMiusuario(Usuario miusuario) {
        this.miusuario = miusuario;
    }

    public Collection<Usuario> getUsuarios() {
        usuarios = usuarioService.getAllusuarios();
        return usuarios;
    }

    public void setUsuarios(Collection<Usuario> usuarios) {
        this.usuarios = usuarios;
    }

    public void crearUsuario() {
        usuarioService.crearUsuario(miusuario);
        System.out.println("UsuarioController>CrearUsuario");
    }

    public void eliminarUsuario() {

        FacesMessage msg = null;
        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, MessageProvider.getValue("correcto"), MessageProvider.getValue("producto_borrado"));
        usuarioService.borrar(this.miusuario);
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public String login(RequestContext context) {
        System.out.println("login");
        try {

            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
            UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(miusuario.getUsername(), miusuario.getPassword());
            authToken.setDetails(authentication.getDetails());
            Authentication newAuth = authenticationManager.authenticate(authToken);
            SecurityContextHolder.getContext().setAuthentication(newAuth);

            if (newAuth.isAuthenticated()) {

                context.getFlowScope().put("usuario", usuarioService.getCurrentUser());

            } else {
            }


        } catch (Exception unfe) {

            return "redirect:registro";
        }
        return "redirect:ir_portada";
    }

    /*
    public String asignarAdministrador(@RequestParam("username") String username,Model model) {

    Usuario u=usuarioService.buscarUsername(username);
    // if(!usuarioService.isAdmin() ){
    usuarioService.crearAdmin(u);

    return "redirect:listadousers";
    }
     */
    //@RequestMapping(method = RequestMethod.GET, value = "/logout")
    public String logout(SessionStatus sessionStatus, RequestContext context) throws java.io.IOException {
        //System.out.println("UsuarioController logout se está desconectando " + usuario.getUsername());
        SecurityContextHolder.getContext().setAuthentication(null);
        Usuario desconectado = (Usuario) context.getFlowScope().extract("usuario");
        //System.out.println("UsuarioController logout se está desconectando2 " + usuario.getUsername());
        sessionStatus.setComplete();
        //Otra forma: sesion.invalidate();
        return "/portada";
    }

    public void nombrarAdmin() {
        FacesMessage msg = null;
        Usuario u = usuarioService.buscar(this.miusuario);
        u.setEs_admin(true);

        usuarioService.darRolAdmin(u);

        usuarioService.update(u);
        msg = new FacesMessage(FacesMessage.SEVERITY_INFO, MessageProvider.getValue("correcto"), MessageProvider.getValue("producto_borrado"));
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }
}
